# coding=utf-8
# 创建二维数组的辅助函数
def create2dArray(rows, cols):
    # 使用列表推导式创建rows行cols列的二维数组，初始值均为0
    return [[0 for _ in range(cols)] for _ in range(rows)]
 
# 初始化缓存数组，大小为100x100，用于动态规划存储中间结果
cache = create2dArray(100, 100)
 
# 递归函数：计算将beads个相同的珠子放入disks个相同的盒子的分法数
# 注意：不考虑顺序，例如5,1,1和1,5,1被视为同一种分法
def f(beads, disks):
    # 基础情况1：没有盒子时，只有没有珠子才有一种分法
    if disks == 0:
        if beads == 0:
            cache[beads][disks] = 1
            return 1
        else:
            cache[beads][disks] = 0
            return 0
    
    # 基础情况2：只有一个盒子或只有一个珠子时，只有一种分法
    if disks == 1 or beads == 1:
        cache[beads][disks] = 1
        return 1
    
    # 如果缓存中已有结果，直接返回避免重复计算
    if cache[beads][disks] != 0:
        return cache[beads][disks]
    
    # 情况3：盒子数多于珠子数
    # 此时至少有disks-beads个盒子为空，可以忽略这些空盒子
    # 相当于将beads个珠子放入beads个盒子
    if disks > beads:
        return f(beads, beads)
    
    # 情况4：一般情况，分两种策略
    # 1. f(beads, disks-1)：至少有一个盒子为空，相当于将beads个珠子放入disks-1个盒子
    # 2. f(beads-disks, disks)：每个盒子至少有一个珠子，先在每个盒子放一个珠子，剩余beads-disks个珠子再分配
    cache[beads][disks] = f(beads, disks-1) + f(beads-disks, disks)
    return cache[beads][disks]
 
# 主程序部分
# 读取测试用例数量
T = int(input())
# 处理每个测试用例
for _ in range(T):
    # 读取珠子数量和盒子数量
    beads, disks = map(int, input().split())
    # 调用递归函数计算结果并输出
    print(f(beads, disks))